home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / msdos / cc / cc.c next >
C/C++ Source or Header  |  1991-10-18  |  7KB  |  293 lines

  1. #define PROGRAM \
  2.   "CC.EXE コンパイラ・ドライバ V1.04  1991.06.30  by Y.Kurihara (Nif PDC01620)"
  3.  
  4. #define HELP \
  5. "\n使い方  CC [-new] [@file] [ソース(.c) ...] [オブジェクト.obj ...] <オプション>" \
  6. "\n  ソース(.c)       ソース より新しい オブジェクト があれば、コンパイルしない"   \
  7. "\n  オブジェクト.obj  カレントディレクトリ になければ、環境変数 LIB386 のパスを探す"  \
  8. "\n  @file         コマンドファイル file を読み込む"                    \
  9. "\n" \
  10. "\n  オプション  (他のオプションはコイパイラのマニュアルを参照)"                         \
  11. "\n    -new(-n)      全てのソースをコンパイルする"                      \
  12. "\n    -env var=val  環境変数を設定する"                                \
  13. "\n    -test(-t)     コンパイラ、リンカを実行しない"                     \
  14. "\n    -offset       省略形(-off)は使用不可"                            \
  15. "\n" \
  16. "\n  環境変数"                                                          \
  17. "\n    PATH386       *.exp形式ファイルを置くディレクトリ"               \
  18. "\n    LIB386        オブジェクト/ライブラリ を置くディレクトリ"               \
  19. "\n    STDOPT        常に使用するオプション"                            \
  20. "\n" \
  21. "\n  ☆本プロクラムは LSI C-86 Ver 3.20 試食版 でコンパイルしました。"
  22.  
  23.  
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <string.h>
  27. #include <ctype.h>
  28. #include "function.h"
  29. #include "opttbl.h"
  30.  
  31. FILE *fp_obj,*fp_opt;        /*  リンク用のコマンドファイル   */
  32. char *src_lst[32];        /*  ソースファイルの一覧         */
  33. char *exp_arg[32];        /*  EXPファイル実行時の引数      */
  34. int  flg_new = 0;        /*  -new  オプションのフラグ     */
  35. int  flg_tst = 0;        /*  -test オプションのフラグ     */
  36.  
  37. char **cc_src,**cc_opt;
  38. int  opt_type,opt_num;
  39. int  error_level = 0;
  40.  
  41. void main( int argc,char *argv[] );
  42. void make_command( char **argv );    /*  パラメータを分類する  */
  43. void mk_cmd2( char *arg );
  44. void mk_cmd3( char *opt );
  45. void mk_cmd4( char *file );
  46. char *FindLib( char *lib );        /*  ライブラリを検索する  */
  47. void exec_compile( void );        /*  コンパイル & リンクの実行  */
  48. int exec_exp( char *exp,char *argv[] );    /*  *.EXP ファイルを実行する  */
  49.  
  50. void main( int argc,char *argv[] )
  51. {
  52.     puts( PROGRAM );
  53.     if( argc <= 1 ) {
  54.         puts( HELP );
  55.         exit( 0 );
  56.     }
  57.  
  58.     make_command( argv );
  59.     exec_compile();
  60.     exit( error_level );
  61. }
  62.  
  63. void make_command( char **argv )    /*  パラメータを分類する  */
  64. {
  65.     char *stdopt;
  66.  
  67.     fp_obj = fopen( "object.lnk","w" );
  68.     if( fp_obj == NULL )  goto error1;
  69.     fp_opt = fopen( "option.lnk","w" );
  70.     if( fp_opt == NULL )  goto error2;
  71.  
  72.     cc_src = src_lst;
  73.     cc_opt = exp_arg + 3;
  74.  
  75.     opt_type = opt_num  = 0;
  76.     stdopt  = getenv("STDOPT");
  77.     if( stdopt )  stdopt = strdup( stdopt );
  78.     mk_cmd3( stdopt );
  79.  
  80.     opt_type = opt_num  = 0;
  81.     while( *(++argv) )  mk_cmd2( *argv );
  82.  
  83.     *cc_src = *cc_opt = NULL;
  84.  
  85.     fclose( fp_obj );
  86.     fclose( fp_opt );
  87.     return;
  88.  
  89. error1:
  90.     fprintf( stdout,"%s:オープンできません\n","object.lnk" );
  91.     exit(2);
  92. error2:
  93.     fprintf( stdout,"%s:オープンできません\n","option.lnk" );
  94.     exit(2);
  95. }
  96.  
  97. void mk_cmd2( char *arg )
  98. {
  99.     struct OPT_TBL  *opt;
  100.  
  101.     if( arg[0] == '@' ) {        /* コマンドファイルの処理 */
  102.         opt_type = opt_num  = 0;
  103.         mk_cmd4( arg + 1 );
  104.         opt_type = opt_num  = 0;
  105.         return;
  106.     }
  107.     if( arg[0] == '-' ) {        /*  オプションの処理  */
  108.         if( opt = FindOption( arg ) ) {
  109.             opt_type = opt->type;
  110.             opt_num  = opt->num;
  111.         } else {
  112.             opt_type = opt_num  = 0;
  113.             fprintf( stdout,"%s:不正なオプションです\n",arg );
  114.             error_level = 2;
  115.             return;
  116.         }
  117.         switch( opt_type ) {
  118.             case _HIGH:
  119.                 *cc_opt++ = strdup( arg );
  120.                 break;
  121.             case _LINK:
  122.             case _LIB:
  123.                 fprintf( fp_opt,"%s\n",arg );
  124.                 break;
  125.             case _NEW:
  126.                 flg_new = 1;
  127.                 break;
  128.             case _TEST:
  129.                 flg_tst = 1;
  130.                 break;
  131.         }
  132.         return;
  133.     }
  134.  
  135.     if( opt_num != 0 ) {        /*  オプションのパラメータの処理  */
  136.         switch( opt_type ) {
  137.             case _HIGH:    
  138.                 *cc_opt++ = strdup( arg );
  139.                 break;
  140.             case _LINK:    
  141.                 fprintf( fp_opt,"%s\n",arg );
  142.                 break;
  143.             case _LIB:
  144.                 fprintf( fp_opt,"%s\n",FindLib( arg ) );
  145.                 break;
  146.             case _ENV:
  147.                 putenv( strdup( arg ) );
  148.                 break;
  149.         }
  150.         if( --opt_num == 0 )  opt_type = opt_num  = 0;
  151.         return;
  152.     } else {            /*  ソースファイルの処理  */
  153.         char  src[64],obj[22],*ext;
  154.  
  155.         strcpy( src,arg );
  156.         ext = SearchExt( src );
  157.         if( *ext == 0 )  strcpy( ext,".c" );
  158.         if ( strcmpi( ext,".obj" ) == 0 ) {
  159.             fprintf( fp_obj,"%s\n",FindLib( src ) );
  160.             return;
  161.         }
  162.         strcpy( obj,SearchFile( src ) );
  163.         strcpy( SearchExt( obj ),".obj" );
  164.         *cc_src++ = strdup( src );
  165.         *cc_src++ = strdup( obj );
  166.         fprintf( fp_obj,"%s\n",obj );
  167.         return;
  168.     }
  169.     return;
  170. }
  171.  
  172. void mk_cmd3( char *opt )
  173. {
  174.     char  buff[64],*p;
  175.  
  176.     if( opt == NULL )  return;
  177.     while( isspace( *opt ) )  opt++;
  178.     while( *opt && *opt != '!' ) {
  179.         p = buff;
  180.         while( *opt && !isspace( *opt ) && *opt != '!' ) {
  181.             *p++ = *opt++;
  182.         }
  183.         *p = 0;
  184.         mk_cmd2( buff );
  185.         while( isspace( *opt ) )  opt++;
  186.         if( opt_type == _ENV ) {   /* -env のパラメータの処理 */
  187.             mk_cmd2( opt );
  188.             break;
  189.         }
  190.     }
  191.     return;
  192. }
  193.  
  194. void mk_cmd4( char *file )
  195. {
  196.     static FILE *fp_cmd = NULL;
  197.     char buf[100],*p;
  198.  
  199.     if( fp_cmd != NULL )  goto error1;
  200.     fp_cmd = fopen( file,"r" );
  201.     if( fp_cmd == NULL )  goto error1;
  202.     while( fgets( buf,100,fp_cmd ) ) {
  203.         buf[99] = 0;
  204.         for( p = buf; *p; p++ ) {
  205.             if( *p == '\r' || *p == '\n' ) {
  206.                 *p = 0;
  207.                 break;
  208.             }
  209.         }
  210.         if( buf[0] == '/' )  continue;
  211.         if( buf[0] == '*' )  break;
  212.         mk_cmd3( buf );
  213.     }
  214.     fclose( fp_cmd );
  215.     fp_cmd = NULL;
  216.     return;
  217.  
  218. error1:
  219.     fprintf( stdout,"%s:オープンできません\n",file );
  220.     error_level = 2;
  221.     return;
  222. }
  223.  
  224. char *FindLib( char *lib )        /*  ライブラリを検索する  */
  225. {
  226.     static  char  file[64];
  227.     char *lib386,*ext;
  228.  
  229.     lib386  = getenv("LIB386");
  230.     strcpy( file,lib );
  231.     ext = SearchExt( file );
  232.     if( *ext == 0 )  strcpy( ext,".lib" );
  233.  
  234.     lib = FindFile( file,lib386 );
  235.     if( lib == NULL )  return( file );
  236.     return( lib );
  237. }
  238.  
  239. void exec_compile( void )        /*  コンパイル & リンクの実行  */
  240. {
  241.     int  ret;
  242.  
  243.     cc_src  = src_lst;
  244.     while( *cc_src ) {
  245.         if( flg_new ||
  246.             FileTime( cc_src[0] ) >= FileTime( cc_src[1] ) ) {
  247.             exp_arg[2] = *cc_src;
  248.             ret = exec_exp( "HC386P.EXP",exp_arg );
  249.             if( ret > 0 )  error_level = 1;
  250.         }
  251.         cc_src += 2;
  252.     }
  253.  
  254.     if( error_level < 1 ) {
  255.         exp_arg[2] = "@object.lnk";
  256.         exp_arg[3] = "@option.lnk";
  257.         exp_arg[4] = NULL;
  258.         ret = exec_exp( "TLINKP.EXP",exp_arg );
  259.         if( ret > 0 )  error_level = 1;
  260.     }
  261.     return;
  262. }
  263.  
  264. int exec_exp( char *exp,char *argv[] )    /*  *.EXP ファイルを実行する  */
  265. {
  266.     int ret;
  267.     char **p;
  268.     char *path386;
  269.  
  270.     path386 = getenv("PATH386");
  271.     argv[0] = "RUN386.EXE";
  272.     argv[1] = FindFile( exp, path386 );
  273.     if( argv[1] == NULL )  goto error1;
  274.  
  275.     fprintf( stdout,"\n" );
  276.     for( p = argv; *p; fprintf( stdout,"%s ",*p++ ) );
  277.     fprintf( stdout,"\n" );
  278.  
  279.     if( flg_tst )  return( 0 );
  280.     ret = spawnvp( 0, argv[0],argv);
  281.     fprintf( stdout,"Exit Code = %d\n",ret );
  282.     if( ret < 0 )  goto error2;
  283.     return( ret );
  284.  
  285. error1:
  286.     fprintf( stdout,"%s:実行できません\n",exp );
  287.     exit(2);
  288. error2:
  289.     fprintf( stdout,"%s:実行できません\n",*argv );
  290.     exit(2);
  291. }
  292.  
  293.